/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.enums.TipoPortaria;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.AnexoServico;
import br.com.foxinline.servico.PessoaServico;
import br.com.foxinline.servico.PortariaServico;
import br.com.foxinline.servico.SecretariaServico;
import br.com.foxinline.util.Msg;
import br.com.foxinline.utilitarios.ArquivoUtilitario;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarPortaria implements Serializable {

    @EJB
    PessoaServico pessoaServico;
    @EJB
    PortariaServico portariaServico;
    @EJB
    AnexoServico anexoServico;
    @EJB
    SecretariaServico secretariaServico;
    private Portaria portariaPesquisar;
    private Portaria portariaEditar;
    private Portaria portariaVisualizar;
    private Portaria portariaDelete;
    private List<Portaria> portarias;
    private Pessoa pessoaEditar;
    private Pessoa pessoaPesquisar;
    private Pessoa pessoaVisualizar;
    private Usuario usuario;
    private Secretaria secretariaEditar;
    private Secretaria secretariaPesquisar;
    private Secretaria secretariaVisualizar;
    private List<Secretaria> secretarias;
    private List<Anexo> anexosEditar;
    private List<Anexo> anexosVisualizar;
    private List<Anexo> anexosRemover;
    private ArquivoUtilitario arquivoUtilitario = new ArquivoUtilitario();
    private String ePortaria;
    private String vPortaria;

    @PostConstruct
    public void init() {
        portariaPesquisar = new Portaria();
        pessoaPesquisar = iniciarPessoa();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        ePortaria = params.get("ePortaria");
        vPortaria = params.get("vPortaria");
        paramPost();
    }

    public void paramPost() {
        try {
            if (ePortaria != null) {
                portariaEditar = portariaServico.pesquisar(Long.parseLong(ePortaria));
                anexosEditar = portariaEditar.getAnexos() != null ? portariaEditar.getAnexos() : new ArrayList<Anexo>();
                anexosRemover = new ArrayList<Anexo>();
                pessoaEditar = portariaEditar.getPessoa() != null ? portariaEditar.getPessoa() : iniciarPessoa();
                secretariaEditar = portariaEditar.getSecretaria() != null ? portariaEditar.getSecretaria() : new Secretaria();
                secretariaPesquisar = new Secretaria();
            }
            if (vPortaria != null) {
                portariaVisualizar = portariaServico.pesquisar(Long.parseLong(vPortaria));
                anexosVisualizar = portariaVisualizar.getAnexos();
                pessoaVisualizar = portariaVisualizar.getPessoa() != null ? portariaVisualizar.getPessoa() : new Pessoa();
                secretariaVisualizar = portariaVisualizar.getSecretaria() != null ? portariaVisualizar.getSecretaria() : new Secretaria();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void pesquisar() {
        portariaPesquisar.setPessoa(pessoaPesquisar);
        portarias = portariaServico.pesquisar(portariaPesquisar);
    }

    public void atualizar() {
        try {
            arquivoUtilitario.gravarAnexos(anexosEditar);
            anexosEditar = arquivoUtilitario.removerBytes(anexosEditar);

            portariaEditar.setSecretaria(secretariaEditar.getId() != null ? secretariaEditar : null);
            portariaEditar.setAnexos(anexosEditar);
            portariaEditar.setPessoa(pessoaEditar);

            portariaServico.atualizar(portariaEditar);
            
            for (Anexo a : anexosRemover) {
                arquivoUtilitario.excluirArquivo(new File(a.getUrl() + a.getNome()));
            }

            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void deletar() {
        try {
            portarias.remove(portariaDelete);
            portariaServico.remover(portariaDelete);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void existeCliente() {
        Pessoa p = pessoaServico.existProprietario(pessoaEditar);

        if (p != null) {
            pessoaEditar = p;
        } else {
            pessoaEditar.setId(null);
        }
    }

    public void pesquisarSecretaria() {
        secretarias = secretariaServico.pesquisarSecretaria(secretariaPesquisar);
    }

    public void setarSecretaria(Secretaria secretaria) {
        this.secretariaEditar = secretaria;
    }

    public void removerSecretaria() {
        secretariaEditar = new Secretaria();
    }

    public List<SelectItem> getTipoDocumento() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoDocumento tipo : TipoDocumento.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public List<SelectItem> getTipoPortaria() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoPortaria tipo : TipoPortaria.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public String formantarDataPortaria(Portaria portaria) {
        if (portaria.getDataPortaria() != null) {
            return new SimpleDateFormat("dd/MM/yyyy").format(portaria.getDataPortaria());
        }
        return null;
    }

    public String dataNascimento() {
        if (pessoaEditar.getDataNascimento() != null) {
            return new SimpleDateFormat("dd/MM/yyyy").format(pessoaEditar.getDataNascimento());
        }
        return null;
    }

    public String dataNascimentoVisualizar() {
        if (pessoaVisualizar.getDataNascimento() != null) {
            return new SimpleDateFormat("dd/MM/yyyy").format(pessoaVisualizar.getDataNascimento());
        }
        return null;
    }

    public String dataPortaria() {
        if (portariaVisualizar.getDataPortaria() != null) {
            return new SimpleDateFormat("dd/MM/yyyy").format(portariaVisualizar.getDataPortaria());
        }
        return null;
    }
    private static int tamanhoMaximoNome = 10;

    public String nomeAnexo(Anexo a) {
        if (a.getNomeExibicao().length() >= tamanhoMaximoNome) {
            return a.getNomeExibicao().substring(0, tamanhoMaximoNome).concat("...");
        }
        return a.getNomeExibicao().replace(".png", "").replace(" ", "_");
    }

    public String nomeAnexoPdf(Anexo a) {
        if (a.getNomeExibicao().length() >= tamanhoMaximoNome) {
            return a.getNomeExibicao().substring(0, tamanhoMaximoNome).concat("...");
        }
        return a.getNomeExibicao().replace(".pdf", "").replace(" ", "_");
    }

    public void handleAnnex(FileUploadEvent event) throws IOException {
        try {
            anexosEditar.add(arquivoUtilitario.adicionarArquivo(event));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerPesquisarPortaria.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ManagerPesquisarPortaria.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Remove o anexo da lista de anexos do processo que está sendo adicionado e
     * remove o arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerAnexo(Anexo anexo) {
        try {
            anexosRemover.add(anexo);
            anexosEditar.remove(anexo);
        } catch (Exception e) {
            Msg.messagemError(Msg.Failure);
        }
    }

    public Pessoa iniciarPessoa() {
        Pessoa pessoa = new Pessoa();
        pessoa.setTipoDocumento(TipoDocumento.CPF);
        return pessoa;
    }

    public boolean isPessoaFisica() {
        return pessoaEditar.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    public boolean isPessoaFisicaVisualizar() {
        return pessoaVisualizar.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    public boolean isPessoaFisicaPesquisar() {
        return pessoaPesquisar.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    public List<Anexo> getAnexosEditar() {
        return anexosEditar;
    }

    public void setAnexosEditar(List<Anexo> anexosEditar) {
        this.anexosEditar = anexosEditar;
    }

    public List<Anexo> getAnexosVisualizar() {
        return anexosVisualizar;
    }

    public void setAnexosVisualizar(List<Anexo> anexosVisualizar) {
        this.anexosVisualizar = anexosVisualizar;
    }

    public Pessoa getPessoaEditar() {
        return pessoaEditar;
    }

    public void setPessoaEditar(Pessoa pessoa) {
        this.pessoaEditar = pessoa;
    }

    public Pessoa getPessoaPesquisar() {
        return pessoaPesquisar;
    }

    public void setPessoaPesquisar(Pessoa pessoaPesquisar) {
        this.pessoaPesquisar = pessoaPesquisar;
    }

    public Pessoa getPessoaVisualizar() {
        return pessoaVisualizar;
    }

    public void setPessoaVisualizar(Pessoa pessoaVisualizar) {
        this.pessoaVisualizar = pessoaVisualizar;
    }

    public Portaria getPortariaEditar() {
        return portariaEditar;
    }

    public void setPortariaEditar(Portaria portariaEditar) {
        this.portariaEditar = portariaEditar;
    }

    public Portaria getPortariaPesquisar() {
        return portariaPesquisar;
    }

    public void setPortariaPesquisar(Portaria portariaPesquisar) {
        this.portariaPesquisar = portariaPesquisar;
    }

    public Portaria getPortariaVisualizar() {
        return portariaVisualizar;
    }

    public void setPortariaVisualizar(Portaria portariaVisualizar) {
        this.portariaVisualizar = portariaVisualizar;
    }

    public Portaria getPortariaDelete() {
        return portariaDelete;
    }

    public void setPortariaDelete(Portaria portariaDelete) {
        this.portariaDelete = portariaDelete;
    }

    public List<Portaria> getPortarias() {
        return portarias;
    }

    public void setPortarias(List<Portaria> portarias) {
        this.portarias = portarias;
    }

    public Secretaria getSecretariaEditar() {
        return secretariaEditar;
    }

    public void setSecretariaEditar(Secretaria secretaria) {
        this.secretariaEditar = secretaria;
    }

    public Secretaria getSecretariaPesquisar() {
        return secretariaPesquisar;
    }

    public void setSecretariaPesquisar(Secretaria secretariaPesquisar) {
        this.secretariaPesquisar = secretariaPesquisar;
    }

    public Secretaria getSecretariaVisualizar() {
        return secretariaVisualizar;
    }

    public void setSecretariaVisualizar(Secretaria secretariaVisualizar) {
        this.secretariaVisualizar = secretariaVisualizar;
    }

    public List<Secretaria> getSecretarias() {
        return secretarias;
    }

    public void setSecretarias(List<Secretaria> secretarias) {
        this.secretarias = secretarias;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
}
